﻿namespace MaterialTypeRecognition.Shell.Utils
{
    using System;
    using System.Timers;

    public class TimesUpTimer
    {
        private Timer? timer;
        private bool isRunning;
        private TimeSpan duration;
        private DateTime startTime;

        public event EventHandler<TimeSpan>? Tick;  // 定义 Tick 事件，每次计时器滴答时触发，并传递剩余时间作为参数
        public event EventHandler? TimesUp;  // 定义 TimesUp 事件，计时器结束时触发

        public TimeSpan Interval { get; set; }  // 计时器的时间间隔设置属性

        public TimesUpTimer()
        {
            Interval = TimeSpan.FromSeconds(1);  // 默认时间间隔为 1 秒
        }

        public void Start(TimeSpan duration)
        {
            Stop();  // 停止之前的计时器

            this.duration = duration;  // 设置计时器的持续时间
            startTime = DateTime.Now;  // 记录计时器的开始时间

            timer = new Timer(Interval.TotalMilliseconds);  // 创建新的计时器实例并设置时间间隔
            timer.Elapsed += TimerElapsed;  // 设置计时器滴答事件处理程序
            timer.Start();  // 启动计时器
            isRunning = true;  // 将运行状态标记为 true
        }

        public void Stop()
        {
            if (isRunning)
            {
                if (timer != null)
                {
                    timer.Stop();  // 停止计时器
                    timer.Dispose();  // 释放计时器资源
                }
                isRunning = false;  // 将运行状态标记为 false
                TimesUp?.Invoke(this, EventArgs.Empty);  // 触发 TimesUp 事件
            }
        }

        private void TimerElapsed(object? sender, ElapsedEventArgs e)
        {
            var elapsed = DateTime.Now - startTime;  // 计算已经经过的时间
            var remaining = duration - elapsed;  // 计算剩余时间

            if (elapsed >= duration)  // 如果达到持续时间
            {
                Stop();  // 停止计时器
            }
            else
            {
                Tick?.Invoke(this, remaining);  // 触发 Tick 事件，并传递剩余时间作为参数
            }
        }
    }
}
